package com.hava.contentsale.utils;

import java.lang.reflect.Field;
import java.util.*;

/**
 * Created by zhanpeng on 15-1-19.
 * * 其他类继承了这个类直接调用print可以打印所有的属性和属性的值
 */
public abstract class OutputObject {

    public String smallEntityName()
    {
        String entityName = this.getClass().getName();
        System.out.println(entityName);

        return entityName;
    }

    public void printProperties(){
        System.out.println("---" + this.getClass().getName() + "---");

        //由反射来获取property的属性名称、属性值
        Set<Field> fields = this.getFields(this.getClass());

        for(Field field : fields)
        {
            //由于采用了自动化，反射访问的对象可能是私有类型，需要打开对应的权限
            field.setAccessible(true);
            try
            {
                System.out.println("property[" + field.getName() + "]:" + field.get(this));
            }
            catch (IllegalAccessException e) {
            }
            finally {
                field.setAccessible(false);
            }
        }
    }

    public void MapToEntity(Map map)
    {
        //由反射来获取property的属性名称、属性值
        Set<Field> sets = this.getFields(this.getClass());

        for(Field field : sets)
        {
            //由于采用了自动化，反射访问的对象可能是私有类型，需要打开对应的权限
            field.setAccessible(true);
            try {
                Object value = map.get(field.getName());
                if(value == null)
                {
                    field.setAccessible(false);
                    continue;
                }

                field.set(this, value);

            } catch (IllegalAccessException e) {
                e.printStackTrace();
                continue;
            } catch (IllegalArgumentException e) {
                continue;
            }
            field.setAccessible(false);
        }
    }

    public Map EntityToMap()
    {
        Map map = new HashMap();
        //由反射来获取property的属性名称、属性值
        Set<Field> sets = this.getFields(this.getClass());

        for(Field field : sets)
        {
            //由于采用了自动化，反射访问的对象可能是私有类型，需要打开对应的权限
            field.setAccessible(true);
            try {
                map.put(field.getName(),field.get(this));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            finally {
                field.setAccessible(false);
            }
            field.setAccessible(false);
        }

        return map;
    }

    public Set<Field> getFields(Class clazz)
    {
        Set<Field> result = new LinkedHashSet<Field>();
//        if(!(clazz instanceof Object)){
        if(!"java.lang.Object".equals(clazz.getName())) {
            Field[] fields = clazz.getDeclaredFields();
            Set<Field> super_fields = this.getFields(clazz.getSuperclass());

            result.addAll(super_fields);
            result.addAll(Arrays.asList(fields));
        }

        return result;
    }

}